home *** CD-ROM | disk | FTP | other *** search
- #ifndef __CLASSDESC__
- #define __CLASSDESC__
- #pragma once
-
- #ifndef __AEDATAMODEL__
- #include <AEDataModel.h>
- #endif
-
- #include <stddef.h>
-
- typedef SInt16 ClassID;
-
- enum
- {
- kUninitializedClassID = 0,
- kDeletedClassID = -1,
-
- kInvalidClassOffset = 1
- };
-
- #ifndef qMultipleInheritance
- #define qMultipleInheritance 1
- #endif
-
- typedef struct AEClassList AEClassList, *AEClassListPtr, **AEClassListHdl;
- typedef struct AEPropList AEPropList, *AEPropListPtr, **AEPropListHdl;
-
- class AEClassInfo;
- class AEPropInfo;
-
- #if PRAGMA_ALIGN_SUPPORTED
- #pragma options align=mac68k
- #endif
-
- class ClassDesc
- {
- public:
- struct ObjectRef // embed one of these in each object
- {
- ClassID fClassID; // the ID of the class
- SInt16 fClassOffset; // offset to real object
-
- ObjectRef();
- ~ObjectRef();
-
- inline bool IsInitialized() { return fClassID > kUninitializedClassID; }
- };
-
- static ClassDesc* fgClassList; // List of ClassDesc, indexed by class ID.
- static ClassID fgLastClassID; // The last valid class ID.
-
- protected:
- /* 0 */ void* fDefaultConstructor; // Default constructor for this class
-
- /* 4 */ const ClassDesc* fNextClassDesc; // Link to next ClassDesc in list of all ClassDesc.
-
- /* 8 */ const char* fClassName; // Class name
-
- /* 12 */ long fClassSize; // size of class
-
- /* 16 */ SInt16 fClassID; // Unique identifying class ID.
-
- /* 18 */ const ClassDesc* fBaseClass; // (first) base class
-
- /* 22 */ const ClassDesc** fBaseClassDescList; // overflow list of base classes
-
- /* 26 */ SInt16 fClassOffset; // Offset of fClassID in real object
-
- /* 28 */ const DescType* fAEClassIDs; // which AEOM classes do we implement
-
- /* 32 */ AEClassListHdl fAEClassInfo; // cached info for above
-
- public:
- // ClassDesc(size_t size, size_t offset, char* name = nil, const ClassDesc* base_class = nil, const DescType* ae_classes = nil);
- ClassDesc(size_t size, size_t offset, char* name = nil, const ClassDesc** base_List = nil, const DescType* ae_classes = nil);
-
- inline const char* GetClassName() const { return fClassName; }
- inline const ClassDesc* GetFirstBaseClass() const { return fBaseClass; }
- inline const ClassDesc* GetNextClassDesc() const { return fNextClassDesc; }
- inline ClassID GetClassID() const { return fClassID; }
- inline void SetClassID(ClassID theClassID) { fClassID = theClassID; }
-
- void RegisterObject(ObjectRef& ref, void* object) const;
-
- static inline ClassDesc* GetClassList() { return fgClassList; }
- static inline ClassID GetLastClassID() { return fgLastClassID; }
- static inline ClassID GetNumClasses() { return fgLastClassID; }
-
- /*
- AEClassListHdl GetAEClasses() const;
- bool IsAEClass(DescType aClassID) const;
-
- AEClassInfo* GetAEClassInfo(DescType asClass = 0);
- AEPropInfo* GetAEPropInfo(DescType propID, DescType asClass = 0);
- */
- };
-
- #if PRAGMA_ALIGN_SUPPORTED
- #pragma options align=reset
- #endif
-
- enum {
- kIllegalClassOffset = 1 // this would be in the middle of the class
- };
-
- #if qObjectInspector
- #define ClassOffset(name) offsetof(name, fClassID)
- #else
- #define ClassOffset(name) kIllegalClassOffset
- #endif
-
- #define DeclareClass(name) \
- private: static ClassDesc gClassDesc; \
- private: typedef name ThisClass; \
- public: static inline ClassDesc* GetClassDescStatic() { return &gClassDesc; } \
- public: virtual const ClassDesc* GetClassDescDynamic() const
-
- #define DeclareClassAbstract(name) \
- private: static ClassDesc gClassDesc; \
- private: typedef name ThisClass; \
- public: static inline ClassDesc* GetClassDescStatic() { return &gClassDesc; } \
- public: virtual const ClassDesc* GetClassDescDynamic() const = 0
-
- #define DeclareClassNoBase(name) \
- DeclareClass(name)
-
- #define DeclareClassNoBaseAbstract(name) \
- DeclareClassAbstract(name)
-
- #define DeclareClassSingle(name, parent) \
- private: typedef parent Inherited; \
- DeclareClass(name)
-
- #define DeclareClassSingleAbstract(name, parent) \
- private: typedef parent Inherited; \
- DeclareClassAbstract(name)
-
- #define DeclareClass1Base(name, base1) DeclareClassSingle(name, base1)
- #define DeclareClass1BaseAbstract(name, base1) DeclareClassSingleAbstract(name, base1)
-
- #define DeclareClass2Base(name, base1, base2) DeclareClass(name)
- #define DeclareClass2BaseAbstract(name, base1, base2) DeclareClassAbstract(name)
-
- #define DeclareClass3Base(name, base1, base2, base3) DeclareClass(name)
- #define DeclareClass3BaseAbstract(name, base1, base2, base3) DeclareClassAbstract(name)
-
-
- #define DefineClass(name) \
- ClassDesc name::gClassDesc(sizeof(name), ClassOffset(name), #name, (const ClassDesc**) nil); \
- const ClassDesc* name::GetClassDescDynamic() const { return &gClassDesc; }
-
-
- #define DefineClassNoBase(name) \
- ClassDesc name::gClassDesc(sizeof(name), ClassOffset(name), #name, (const ClassDesc**) nil); \
- const ClassDesc* name::GetClassDescDynamic() const { return &gClassDesc; }
-
- #define DefineClassNoBaseAbstract(name) \
- ClassDesc name::gClassDesc(sizeof(name), ClassOffset(name), #name, (const ClassDesc**) nil)
-
- #define DefineClassSingle(name) \
- static ClassDesc* __##name##_base_list[] = { \
- name::Inherited::GetClassDescStatic(), nil}; \
- ClassDesc name::gClassDesc(sizeof(name), ClassOffset(name), #name, __##name##_base_list); \
- const ClassDesc* name::GetClassDescDynamic() const { return &gClassDesc; }
-
- #define DefineClassSingleAE(name, classlist) \
- static ClassDesc* __##name##_base_list[] = { \
- name::Inherited::GetClassDescStatic(), nil}; \
- ClassDesc name::gClassDesc(sizeof(name), ClassOffset(name), #name, __##name##_base_list, classlist); \
- const ClassDesc* name::GetClassDescDynamic() const { return &gClassDesc; }
-
- #define DefineClassSingleAbstract(name) \
- static ClassDesc* __##name##_base_list[] = { \
- name::Inherited::GetClassDescStatic(), nil}; \
- ClassDesc name::gClassDesc(sizeof(name), ClassOffset(name), #name, __##name##_base_list)
-
- #define DefineClassSingleAbstractAE(name, classlist) \
- static ClassDesc* __##name##_base_list[] = { \
- name::Inherited::GetClassDescStatic(), nil}; \
- ClassDesc name::gClassDesc(sizeof(name), ClassOffset(name), #name, __##name##_base_list, classlist)
-
- #define DefineClassSingleAbstractAE1(name, classID) \
- static const DescType ae_classes[] = { classID, 0 }; \
- static ClassDesc* __##name##_base_list[] = { \
- name::Inherited::GetClassDescStatic(), nil}; \
- ClassDesc name::gClassDesc(sizeof(name), ClassOffset(name), #name, __##name##_base_list, ae_classes)
-
- #define DefineClassSingleAbstractAE2(name, classID1, classID2) \
- static const DescType ae_classes[] = { classID1, classID2, 0 }; \
- static ClassDesc* __##name##_base_list[] = { \
- name::Inherited::GetClassDescStatic(), nil}; \
- ClassDesc name::gClassDesc(sizeof(name), ClassOffset(name), #name, __##name##_base_list, ae_classes)
-
- #define DefineClassSingleAbstractAE3(name, classID1, classID2, classID3) \
- static const DescType ae_classes[] = { classID1, classID2, classID3, 0 }; \
- static ClassDesc* __##name##_base_list[] = { \
- name::Inherited::GetClassDescStatic(), nil}; \
- ClassDesc name::gClassDesc(sizeof(name), ClassOffset(name), #name, __##name##_base_list, ae_classes)
-
- #define DefineClass1Base(name, base1) \
- static ClassDesc* __##name##_base_list[] = { \
- base1::GetClassDescStatic(), nil}; \
- ClassDesc name::gClassDesc(sizeof(name), ClassOffset(name), #name, __##name##_base_list); \
- const ClassDesc* name::GetClassDescDynamic() const { return &gClassDesc; }
-
- #define DefineClass1BaseAbstract(name, base1) \
- static ClassDesc* __##name##_base_list[] = { \
- base1::GetClassDescStatic(), nil}; \
- ClassDesc name::gClassDesc(sizeof(name), ClassOffset(name), #name, __##name##_base_list)
-
- #define DefineClass2Base(name, base1, base2) \
- static ClassDesc* __##name##_base_list[] = { \
- base1::GetClassDescStatic(), \
- base2::GetClassDescStatic(), nil}; \
- ClassDesc name::gClassDesc(sizeof(name), ClassOffset(name), #name, __##name##_base_list); \
- const ClassDesc* name::GetClassDescDynamic() const { return &gClassDesc; }
-
- #define DefineClass2BaseAbstract(name, base1, base2) \
- static ClassDesc* __##name##_base_list[] = { \
- base1::GetClassDescStatic(), \
- base2::GetClassDescStatic(), nil}; \
- ClassDesc name::gClassDesc(sizeof(name), ClassOffset(name), #name, __##name##_base_list)
-
- #define DefineClass3Base(name, base1, base2, base3) \
- static ClassDesc* __##name##_base_list[] = { \
- base1::GetClassDescStatic(), \
- base2::GetClassDescStatic(), \
- base3::GetClassDescStatic(), nil}; \
- ClassDesc name::gClassDesc(sizeof(name), ClassOffset(name), #name, __##name##_base_list); \
- const ClassDesc* name::GetClassDescDynamic() const { return &gClassDesc; }
-
- #define DefineClass3BaseAbstract(name, base1, base2, base3) \
- static ClassDesc* __##name##_base_list[] = { \
- base1::GetClassDescStatic(), \
- base2::GetClassDescStatic(), \
- base3::GetClassDescStatic(), nil}; \
- ClassDesc name::gClassDesc(sizeof(name), ClassOffset(name), #name, __##name##_base_list)
-
- #define DefineClass4Base(name, base1, base2, base3, base4) \
- static ClassDesc* __##name##_base_list[] = { \
- base1::GetClassDescStatic(), \
- base2::GetClassDescStatic(), \
- base3::GetClassDescStatic(), \
- base4::GetClassDescStatic(), nil}; \
- ClassDesc name::gClassDesc(sizeof(name), ClassOffset(name), #name, __##name##_base_list); \
- const ClassDesc* name::GetClassDescDynamic() const { return &gClassDesc; }
-
- #define DefineClass4BaseAbstract(name, base1, base2, base3, base4) \
- static ClassDesc* __##name##_base_list[] = { \
- base1::GetClassDescStatic(), \
- base2::GetClassDescStatic(), \
- base3::GetClassDescStatic(), \
- base4::GetClassDescStatic(), nil}; \
- ClassDesc name::gClassDesc(sizeof(name), ClassOffset(name), #name, __##name##_base_list);
-
- #define DefineClass5Base(name, base1, base2, base3, base4, base5) \
- static ClassDesc* __##name##_base_list[] = { \
- base1::GetClassDescStatic(), \
- base2::GetClassDescStatic(), \
- base3::GetClassDescStatic(), \
- base4::GetClassDescStatic(), \
- base5::GetClassDescStatic(), nil}; \
- ClassDesc name::gClassDesc(sizeof(name), ClassOffset(name), #name, __##name##_base_list); \
- const ClassDesc* name::GetClassDescDynamic() const { return &gClassDesc; }
-
- #define DefineClass5BaseAbstract(name, base1, base2, base3, base4, base5) \
- static ClassDesc* __##name##_base_list[] = { \
- base1::GetClassDescStatic(), \
- base2::GetClassDescStatic(), \
- base3::GetClassDescStatic(), \
- base4::GetClassDescStatic(), \
- base5::GetClassDescStatic(), nil}; \
- ClassDesc name::gClassDesc(sizeof(name), ClassOffset(name), #name, __##name##_base_list);
-
- #endif // __CLASSDESC__
-
-
-